package com.podium.communal.controller;

import com.alibaba.fastjson2.JSONObject;
import com.podium.comment.AjaxResult;
import com.podium.comment.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

/**
 * @author 邵文泽
 * @description 通用控制器
 * @date 2025/4/30 9:10
 */
@Slf4j
@RestController
@RequestMapping("/communal")
public class CommunalController {

    /**
     * 文件储存路径
     */
    @Value("${upload.path}")
    private String uploadPath;

    /**
     * 文件访问前缀
     */
    @Value("${upload.prefix}")
    private String prefix;

    @PostMapping("/uploadFile")
    public AjaxResult<JSONObject> uploadFile(MultipartFile file, String currentDir) throws IOException {

        if (file == null || file.isEmpty()) {
            return new AjaxResult<JSONObject>().error("文件为空，请选择一个文件上传。");
        }

        if (file.getSize() > 1024 * 1024 * 10) {
            return new AjaxResult<JSONObject>().error("文件过大，请选择小于10M的文件上传。");
        }

        if (!StringUtils.hasLength(file.getOriginalFilename())) {
            return new AjaxResult<JSONObject>().error("文件名为空，请选择一个文件上传。");
        }

        if (!StringUtils.hasLength(currentDir)) {
            currentDir = "default";
        }

        String fileType = file.getContentType();
        if (!StringUtils.hasLength(fileType)) {

            if (!isValidFileType(fileType)) {
                return new AjaxResult<JSONObject>().error("文件类型错误，请选择图片上传。");
            }

            fileType = file.getOriginalFilename().split("\\.")[1];
        }

        String newName = System.currentTimeMillis() + "." + fileType.substring(fileType.lastIndexOf("/") + 1);
        String fileUrl = "/" + currentDir + "/" + newName;
        String filePath = uploadPath + File.separator + currentDir + File.separator + newName;

        File localFile = new File(filePath);

        if (!localFile.exists()) {
            if (!localFile.getParentFile().exists()) {
                boolean mkdir = localFile.getParentFile().mkdirs();
                if (!mkdir) {
                    log.error("创建文件夹失败，请检查upload.path配置。");
                    return new AjaxResult<JSONObject>().error("上传文件失败,请联系管理员或重试！");
                }
            }
        }

        file.transferTo(localFile);

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("fileName", file.getOriginalFilename());
        jsonObject.put("fileNewName", newName);
        jsonObject.put("fileSize", file.getSize());
        jsonObject.put("fileType", file.getContentType());
        jsonObject.put("fileUrl", "/" + prefix + fileUrl);
        return new AjaxResult<JSONObject>().success(jsonObject);
    }

    /**
     * 判断文件类型是否为有效的文件类型
     * @param contentType 文件类型
     */
    public boolean isValidFileType(String contentType) {
        return contentType != null && (
                contentType.startsWith("image/") ||
                        contentType.startsWith("video/") ||
                        isDocumentType(contentType)
        );
    }

    /**
     * 判断文件类型是否为文档类型
     * @param contentType 文件类型
     */
    private boolean isDocumentType(String contentType) {
        // 添加其他文档类型的 MIME 类型
        return "application/pdf".equals(contentType) ||
                "application/msword".equals(contentType) ||
                "application/vnd.openxmlformats-officedocument.wordprocessingml.document".equals(contentType);
    }

}
